home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / game / pr / src / mmv2.c < prev    next >
C/C++ Source or Header  |  1995-08-20  |  19KB  |  737 lines

  1. /*===================================
  2.     Make polygon Map data
  3.                 3D test version.
  4. ===================================*/
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <math.h>
  9. #include    <egb.h>
  10. #include    <filekh.h>
  11.  
  12. char    EgbWork[EgbWorkSize];
  13.  
  14. #define    MAPFILE    "course01.pmd"
  15. #define    C32K(b,r,g)    (0x01*(b)+0x020*(r)+0x400*(g))
  16. #define C32B(col)    ((col)%0x20)
  17. #define C32R(col)    (((col)/0x20)%0x20)
  18. #define C32G(col)    ((col)/0x400)
  19. #define    ROADCOL C32K(18,12,12)
  20. #define EDCOL1  C32K(0,30,0)
  21. #define EDCOL2  C32K(30,30,30)
  22. #define EDGE    5
  23.  
  24. typedef struct {
  25.     short    x,y,z;
  26. } p3d;
  27. typedef struct {                /*    Polygon データ    */
  28.     p3d        pt[4];
  29.     short    type;
  30. } poly;
  31. typedef struct {
  32.     short    px[4];
  33.     short    py[4];
  34.     short    pz;
  35.     p3d        kv;
  36. } rdata;
  37.  
  38. #define RMAX 1800
  39. #define PMAX 6000
  40. #define STEP 400
  41. #define CSTEP 200
  42. #define RDMAG 5/5
  43. #define SMTLEV 5
  44.  
  45. typedef struct {
  46.     short x,y,z;
  47.     short wl,wr;
  48.     short bank;
  49.     short stp;
  50. } Road;
  51. Road road[RMAX];
  52.  
  53. poly    rdpol[RMAX];
  54. rdata    rddat[RMAX];
  55. short    polmax,pn,rd=0;
  56. poly    mapdata[PMAX];
  57. short    chk[20],chks,exTime[20];
  58.  
  59. //    objects
  60. poly    mt[4];
  61. poly    stand[12];
  62. poly    gt[3];
  63. poly    pd[3];
  64. poly    cp[2];
  65. poly    cvp[5];
  66.  
  67. short    step=STEP;
  68. double    cang=0;    // current angle
  69. short    cx=0,cy=0,cz=0;
  70. short    cwl=0,cwr=0,cbank=0;
  71. double    pi=_PI;
  72. int        crd=0;    // current road number
  73.  
  74. /*=======================================
  75.     subroutines for setting road[]
  76. =======================================*/
  77. void setR( short stp )
  78. {
  79.     if( crd>=RMAX ) exit ;
  80.     road[crd].x = cx ;
  81.     road[crd].y = cy ;
  82.     road[crd].z = cz+150 ;
  83.     road[crd].wl = cwl ;
  84.     road[crd].wr = cwr ;
  85.     road[crd].bank = cbank ;
  86.     road[crd].stp = stp ;
  87. //    printf("<%d,%d,%d>\n",cx,cy,cz);
  88. }
  89.  
  90. void
  91. goStr( len, nz )
  92.     short    len, nz ;
  93. {
  94.     printf("go strait : %d[%d]\n",len,nz);
  95.     short    clen=0;
  96.     short    sx=cx,sy=cy,sz=cz;
  97.     int        i,j=len/STEP+1 ;
  98.     for(i=1; i<=j; ++i)
  99.     {
  100.         clen = len*i/j ;
  101.         crd++ ;
  102.         cx = sx + clen*cos(cang) ;
  103.         cy = sy + clen*sin(cang) ;
  104.         cz = sz + (nz-sz)*clen/len ;
  105.         setR(len/j);
  106.     }
  107. }
  108.  
  109. void    setCvp(short x,short y,short z,double ang);
  110.  
  111. void 
  112. curveRt( r, nang, nz, nbank )
  113.     short    r;
  114.     double    nang;
  115.     short    nz, nbank;
  116. {
  117.     printf("curve Right : r=%d,nang=%f,nz=%d\n",r,nang,nz);
  118.     short    ox,oy, sz=cz ;
  119.     short    sbank=cbank ;
  120.     double    sang=cang;
  121.     int        i,j=r*(nang-sang)/CSTEP+1;
  122.     ox = cx - r*sin(cang) ;
  123.     oy = cy + r*cos(cang) ;
  124.     for(i=1; i<=j; ++i)
  125.     {
  126.         cang = sang+(nang-sang)*i/j ;
  127.         ++crd ;
  128.         cx = ox + r*sin(cang) ;
  129.         cy = oy - r*cos(cang) ;
  130.         cz = sz + (nz-sz)*i/j ;
  131.         cbank = sbank + (nbank-sbank)*i/j ;
  132.         setR(r*(nang-sang)/j);
  133.         if( 200<r && r<=400 )
  134.             setCvp( cx,cy,cz+500,cang );
  135.     }
  136.     cang = nang ;
  137.     cz = nz ;
  138.     cbank = nbank;
  139. }
  140. void 
  141. curveLf( r, nang, nz, nbank )
  142.     short    r;
  143.     double    nang;
  144.     short    nz, nbank;
  145. {
  146.     printf("curve Left : %d[%d]\n",r,nz);
  147.     short    ox,oy, sz=cz ;
  148.     short    sbank=cbank ;
  149.     double  sang=cang;
  150.     int        i,j=r*(sang-nang)/CSTEP+1;
  151.     nbank = -nbank ;
  152.     ox = cx + r*sin(cang) ;
  153.     oy = cy - r*cos(cang) ;
  154.     for(i=1; i<=j; ++i)
  155.     {
  156.         cang = sang+(nang-sang)*i/j ;
  157.         ++crd ;
  158.         cx = ox - r*sin(cang) ;
  159.         cy = oy + r*cos(cang) ;
  160.         cz = sz + (nz-sz)*i/j ;
  161.         cbank = sbank + (nbank-sbank)*i/j ;
  162.         setR(r*(sang-nang)/j) ;
  163.         if( 200<r && r<=400 )
  164.             setCvp( cx,cy,cz+500, cang+pi );
  165.     }
  166.     cang = nang ;
  167.     cz = nz ;
  168.     cbank = nbank;
  169. }
  170.  
  171. /*====================
  172.     pol -> kvect
  173. ====================*/
  174. p3d ortholize( p3d vec )
  175. {
  176.     double l;
  177.     l = sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z) ;
  178.     if(l==0) return vec;
  179.  
  180.     vec.x = (double)vec.x*1000/l ;
  181.     vec.y = (double)vec.y*1000/l ;
  182.     vec.z = (double)vec.z*1000/l ;
  183.     return vec ;
  184. }
  185. p3d    exterior( poly pol )
  186. {
  187.     p3d    kv;
  188.     kv.x = (pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].z-pol.pt[0].z)/100
  189.           -(pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].y-pol.pt[0].y)/100 ;
  190.     kv.y = (pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].x-pol.pt[0].x)/100
  191.           -(pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].z-pol.pt[0].z)/100 ;
  192.     kv.z = (pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].y-pol.pt[0].y)/10
  193.           -(pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].x-pol.pt[0].x)/10 ;
  194.     return ortholize( kv );
  195. }
  196. int    inner( p3d a, p3d b )
  197. {
  198.     int i ;
  199.     i = a.x*b.x ;
  200.     i+= a.y*b.y ;
  201.     i+= a.z*b.z ;
  202.     return i ;
  203. }
  204. /*==========================
  205.     超簡易レンダリング?
  206. ==========================*/
  207. short colset( poly pol )
  208. {
  209.     p3d ray ;
  210.     ray.x=1,ray.y=1,ray.z=2 ;
  211.     ray = ortholize( ray ) ;
  212.     p3d kv ;
  213.     kv = exterior( pol ) ;
  214.     int i;
  215.     i = _abs( inner(ray,kv) )/100 ;    // 0 <= i <= 10000
  216.     i = ( 4000 + i*7/10 ) ;        // 環境光 40%
  217.  
  218.     int    b,r,g;
  219.     b = C32B(pol.type) ;
  220.     r = C32R(pol.type) ;
  221.     g = C32G(pol.type) ;
  222.  
  223.     b = ((b*i)/10000) ; b = _min(31,b) ;
  224.     r = ((r*i)/10000) ; r = _min(31,r) ;
  225.     g = ((g*i)/10000) ; g = _min(31,g) ;
  226.     return C32K(b,r,g);
  227. }
  228. /*=================================
  229.     road[] -> mapdata[],rddat[]
  230. =================================*/
  231. #define    X(i)    (road[i].x)
  232. #define    Y(i)    (road[i].y)
  233. #define    Z(i)    (road[i].z)
  234. #define B(i)    (road[i].bank)
  235. #define L(i)    (road[i].wl)
  236. #define R(i)    (road[i].wr)
  237.  
  238. void makeRdat()
  239. {
  240.     p3d p[RMAX][4];
  241.     poly rdpol ;
  242.     short ax,ay,l;
  243.     short x,y,z;
  244.     int i,lz,j,a,b;
  245.     road[0] = road[crd];
  246.     road[crd+1] = road[1];
  247.  
  248.     //    スムージング
  249.     int smtlev = SMTLEV;
  250.     while(smtlev>=0)
  251.     {
  252.         smtlev--;
  253.         lz=road[crd-1].z ;
  254.         for(i=0; i<=crd; ++i)
  255.         {
  256.             a=road[i].stp;
  257.             b=road[i+1].stp;
  258.             j = ((lz*b+road[i+1].z*a)/(a+b)*1+road[i].z*1)/2 ;
  259.             lz = road[i].z ;
  260.             road[i].z = j;
  261.         }
  262.         road[crd+1] = road[1];
  263.     }
  264.     //    道幅変更(^^;)
  265.     for(i=0; i<=crd+1; ++i)
  266.     {
  267.         road[i].wr = road[i].wr*RDMAG ;
  268.         road[i].wl = road[i].wl*RDMAG ;
  269.     }
  270.     for(i=0; i<=crd; ++i)
  271.     {
  272.         ay = X(i+1) - X(i) ;
  273.         ax =-Y(i+1) + Y(i) ;
  274.         l = sqrt( ax*ax + ay*ay );
  275.  
  276.         p[i][0].x = X(i) - ax* (L(i)+EDGE)/l ;
  277.         p[i][0].y = Y(i) - ay* (L(i)+EDGE)/l ;
  278.         p[i][0].z = Z(i) + (L(i)+EDGE)*sin((B(i)+20)*pi/1800)*10 ;
  279.  
  280.         p[i][1].x = X(i) - ax* L(i)/l ;
  281.         p[i][1].y = Y(i) - ay* L(i)/l ;
  282.         p[i][1].z = Z(i) + L(i)*sin(B(i)*pi/1800)*10 ;
  283.  
  284.         p[i][2].x = X(i) + ax* R(i)/l ;
  285.         p[i][2].y = Y(i) + ay* R(i)/l ;
  286.         p[i][2].z = Z(i) - R(i)*sin((B(i)+20)*pi/1800)*10 ;
  287.  
  288.         p[i][3].x = X(i) + ax* (R(i)+EDGE)/l ;
  289.         p[i][3].y = Y(i) + ay* (R(i)+EDGE)/l ;
  290.         p[i][3].z = Z(i) - (R(i)+EDGE)*sin(B(i)*pi/1800)*10 ;
  291.     }
  292.     for(i=0; i<4; ++i)
  293.         p[crd+1][i] = p[crd][i];
  294.     for(i=0; i<crd; ++i)
  295.     {
  296.         mapdata[pn].pt[0] = p[i][0] ;
  297.         mapdata[pn].pt[1] = p[i+1][0] ;
  298.         mapdata[pn].pt[2] = p[i+1][1] ;
  299.         mapdata[pn].pt[3] = p[i][1] ;
  300.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  301.         mapdata[pn].type = colset(mapdata[pn]);
  302.         
  303.         ++pn ;
  304.         mapdata[pn].pt[0] = p[i][1] ;
  305.         mapdata[pn].pt[1] = p[i+1][1] ;
  306.         mapdata[pn].pt[2] = p[i+1][2] ;
  307.         mapdata[pn].pt[3] = p[i][2] ;
  308.         mapdata[pn].type = ROADCOL ;
  309.         mapdata[pn].type = colset(mapdata[pn]);
  310.         ++pn ;
  311.         mapdata[pn].pt[0] = p[i][2];
  312.         mapdata[pn].pt[1] = p[i+1][2];
  313.         mapdata[pn].pt[2] = p[i+1][3];
  314.         mapdata[pn].pt[3] = p[i][3];
  315.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  316.         mapdata[pn].type = colset(mapdata[pn]);
  317.         ++pn;
  318.  
  319.         rdpol.pt[0] = p[i][1] ;
  320.         rdpol.pt[1] = p[i+1][1] ;
  321.         rdpol.pt[2] = p[i+1][2] ;
  322.         rdpol.pt[3] = p[i][2] ;
  323.  
  324.         rddat[rd].px[0] = p[i][1].x ;
  325.         rddat[rd].py[0] = p[i][1].y ;
  326.         rddat[rd].px[1] = p[i+1][1].x ;
  327.         rddat[rd].py[1] = p[i+1][1].y ;
  328.         rddat[rd].px[2] = p[i+1][2].x ;
  329.         rddat[rd].py[2] = p[i+1][2].y ;
  330.         rddat[rd].px[3] = p[i][2].x ;
  331.         rddat[rd].py[3] = p[i][2].y ;
  332.         rddat[rd].pz = p[i][1].z ;
  333.         rddat[rd].kv = exterior( rdpol ) ;
  334.         rd++ ;
  335.     }
  336. }
  337.  
  338. save_texdat( short sx, short sy, double sang )
  339. {
  340.     short    sangle;
  341.     int i,j,k;
  342.     sang = sang*500/pi;
  343.     sangle = sang;
  344.     sangle = (sangle+10000)%1000;
  345.  
  346.     FILE *fp;
  347.     fp=fopen(MAPFILE,"wb");
  348.     if (fp==NULL) return 0;
  349.  
  350.     putShort(sx,fp);
  351.     putShort(sy,fp);
  352.     putShort(sangle,fp);
  353.  
  354.     putShort(polmax,fp);
  355.     for (i=0;i<polmax;i++){
  356.         for(j=0; j<4; ++j){
  357.             putShort(mapdata[i].pt[j].x,fp);
  358.             putShort(mapdata[i].pt[j].y,fp);
  359.             putShort(mapdata[i].pt[j].z,fp);
  360.         }
  361.         putShort(mapdata[i].type,fp);
  362.     }
  363.  
  364.     putShort(rd,fp);
  365.     fwrite((char *)rddat, sizeof(rdata), rd, fp);
  366.     putShort(chks,fp);
  367.     fwrite((char *)chk, sizeof(short), chks, fp);
  368.     fwrite((char *)exTime, sizeof(short), chks, fp);
  369.  
  370.     if (ferror(fp)){
  371.         puts("File write error!!");
  372.         return 0;
  373.     }
  374.     return 1;
  375. }
  376.  
  377. void    initGrp()
  378. {
  379.     EGB_init( EgbWork, EgbWorkSize );    /* 初期化           */
  380.     EGB_resolution ( EgbWork, 0, 3 );    /* 32k(320*240)        */
  381.     EGB_resolution ( EgbWork, 1, 3 );    /* 16 (640*480)        */
  382.     EGB_displayPage( EgbWork, 1, 3 );    /* 表示ページの指定    */
  383.  
  384.     EGB_writePage  ( EgbWork, 0    );
  385.     EGB_writeMode  ( EgbWork, 0    );    /*※描画モードの設定 */
  386.     EGB_paintMode  ( EgbWork, 0x20 );
  387. }
  388.  
  389. void    putlmap()
  390. {
  391.     int    i, j;
  392.     char    para[10];
  393.     struct {
  394.         unsigned short    num;
  395.         short    p[8];
  396.     } poly;
  397.     poly.num = 4;
  398.  
  399.     EGB_paintMode( EgbWork, 0x02 );
  400.     for(i=0; i<=25000; i+=500)
  401.     {
  402.         EGB_color( EgbWork, 0, i%5000==0 ? 9 : 1 );
  403.         WORD(para+0) = 2;
  404.         WORD(para+2) = 0;    WORD(para+4) = i*640/25000;//480
  405.         WORD(para+6) = 639;    WORD(para+8) = i*640/25000;
  406.         EGB_connect( EgbWork, para );
  407.         WORD(para+4) = 0;    WORD(para+2) = i*640/25000;
  408.         WORD(para+8) = 639;    WORD(para+6) = i*640/25000;
  409.         EGB_connect( EgbWork, para );
  410.     }
  411.  
  412.     EGB_paintMode( EgbWork, 0x02 );
  413.     for(i=0; i<polmax; ++i){
  414.         for(j=0; j<4; ++j){
  415.             poly.p[2*j  ] = mapdata[i].pt[j].x *640/25000;
  416.             poly.p[2*j+1] = mapdata[i].pt[j].y *640/25000;
  417.         }
  418.         EGB_color( EgbWork, 2, 15 );
  419.         EGB_polygon( EgbWork, &poly );
  420.     }
  421. }
  422. void    putPoly( pol, n, x,y,z, angle, dx,dy,dz, dcol )
  423.     poly *pol;
  424.     int n;
  425.     short x,y,z;
  426.     double angle;
  427.     int dx,dy,dz;
  428.     short dcol;
  429. {
  430.     dz *=10;
  431.     int i,j;
  432.     for(i=0; i<n; ++i)
  433.     {
  434.         for(j=0; j<4; ++j)
  435.         {
  436.             mapdata[pn].pt[j].x =    pol[i].pt[j].x*cos(angle)*dx -
  437.                                     pol[i].pt[j].y*sin(angle)*dy +x;
  438.             mapdata[pn].pt[j].y =    pol[i].pt[j].x*sin(angle)*dx +
  439.                                       pol[i].pt[j].y*cos(angle)*dy +y;
  440.             mapdata[pn].pt[j].z =    pol[i].pt[j].z*dz +z;
  441.             mapdata[pn].type = (pol[i].type)*dcol;
  442.         }
  443.         ++pn;
  444.     }
  445. }
  446.  
  447. //    以上 共通部分
  448. void    setPolData()
  449. {
  450.     //    Mountain    ( 四角錐 )
  451.     mt[0].pt[0].x =0;    mt[0].pt[0].y =1;    mt[0].pt[0].z =0;
  452.     mt[0].pt[1].x =1;    mt[0].pt[1].y =0;    mt[0].pt[1].z =0;
  453.     mt[0].pt[2].x =0;    mt[0].pt[2].y =0;    mt[0].pt[2].z =1;
  454.     mt[0].pt[3].x =0;    mt[0].pt[3].y =0;    mt[0].pt[3].z =1;
  455.     mt[0].type = 25;
  456.     mt[1].pt[0].x =1;    mt[1].pt[0].y =0;    mt[1].pt[0].z =0;
  457.     mt[1].pt[1].x =0;    mt[1].pt[1].y =-1;    mt[1].pt[1].z =0;
  458.     mt[1].pt[2].x =0;    mt[1].pt[2].y =0;    mt[1].pt[2].z =1;
  459.     mt[1].pt[3].x =0;    mt[1].pt[3].y =0;    mt[1].pt[3].z =1;
  460.     mt[1].type = 28;
  461.     mt[2].pt[0].x =0;    mt[2].pt[0].y =-1;    mt[2].pt[0].z =0;
  462.     mt[2].pt[1].x =-1;    mt[2].pt[1].y =0;    mt[2].pt[1].z =0;
  463.     mt[2].pt[2].x =0;    mt[2].pt[2].y =0;    mt[2].pt[2].z =1;
  464.     mt[2].pt[3].x =0;    mt[2].pt[3].y =0;    mt[2].pt[3].z =1;
  465.     mt[2].type = 31;
  466.     mt[3].pt[0].x =-1;    mt[3].pt[0].y =0;    mt[3].pt[0].z =0;
  467.     mt[3].pt[1].x =0;    mt[3].pt[1].y =1;    mt[3].pt[1].z =0;
  468.     mt[3].pt[2].x =0;    mt[3].pt[2].y =0;    mt[3].pt[2].z =1;
  469.     mt[3].pt[3].x =0;    mt[3].pt[3].y =0;    mt[3].pt[3].z =1;
  470.     mt[3].type = 28;
  471.  
  472.     //    Stand
  473.     short    i,j,n;
  474.     short    scol[3][4]={ 
  475.         { C32K(31,0,10),C32K(31,0,15),C32K(31,0,12),C32K(31,0,16) },
  476.         { C32K(31,0,18),C32K(31,0,22),C32K(31,0,10),C32K(31,0,19) },
  477.         { C32K(31,0,15),C32K(31,0,11),C32K(31,0,18),C32K(31,0,13) } };
  478.     for(i=0; i<4; ++i)
  479.         for(j=0; j<3; ++j){
  480.             n=i*3+j;
  481.     stand[n].pt[0].x =i;    stand[n].pt[0].y =-j;    stand[n].pt[0].z =j;
  482.     stand[n].pt[1].x =i+1;    stand[n].pt[1].y =-j;    stand[n].pt[1].z =j;
  483.     stand[n].pt[2].x =i+1;    stand[n].pt[2].y=-j-1;    stand[n].pt[2].z =j+1;
  484.     stand[n].pt[3].x =i;    stand[n].pt[3].y=-j-1;    stand[n].pt[3].z =j+1;
  485.     stand[n].type = scol[j][i];
  486.         }
  487.  
  488.     //    Pond
  489.     pd[0].pt[0].x =-15;    pd[0].pt[0].y =5;    pd[0].pt[0].z =0;
  490.     pd[0].pt[1].x =-5;    pd[0].pt[1].y =7;    pd[0].pt[1].z =0;
  491.     pd[0].pt[2].x =0;    pd[0].pt[2].y =15;    pd[0].pt[2].z =0;
  492.     pd[0].pt[3].x =-12;    pd[0].pt[3].y =15;    pd[0].pt[3].z =0;
  493.     pd[0].type = 31;
  494.     pd[1].pt[0].x =-12;    pd[1].pt[0].y =15;    pd[1].pt[0].z =0;
  495.     pd[1].pt[1].x =0;    pd[1].pt[1].y =15;    pd[1].pt[1].z =0;
  496.     pd[1].pt[2].x =2;    pd[1].pt[2].y =22;    pd[1].pt[2].z =0;
  497.     pd[1].pt[3].x =-3;    pd[1].pt[3].y =25;    pd[1].pt[3].z =0;
  498.     pd[1].type = 31;
  499.     pd[2].pt[0].x =25;    pd[2].pt[0].y =5;    pd[2].pt[0].z =0;
  500.     pd[2].pt[1].x =30;    pd[2].pt[1].y =13;    pd[2].pt[1].z =0;
  501.     pd[2].pt[2].x =25;    pd[2].pt[2].y =20;    pd[2].pt[2].z =0;
  502.     pd[2].pt[3].x =17;    pd[2].pt[3].y =17;    pd[2].pt[3].z =0;
  503.     pd[2].type = 31;
  504.  
  505.     //    Gate
  506.     gt[0].pt[0].x =0;    gt[0].pt[0].y =-10;    gt[0].pt[0].z =0;
  507.     gt[0].pt[1].x =0;    gt[0].pt[1].y =-11;    gt[0].pt[1].z =0;
  508.     gt[0].pt[2].x =0;    gt[0].pt[2].y =-11;    gt[0].pt[2].z =8;
  509.     gt[0].pt[3].x =0;    gt[0].pt[3].y =-10;    gt[0].pt[3].z =8;
  510.     gt[0].type = 31;
  511.     gt[1].pt[0].x =0;    gt[1].pt[0].y =10;    gt[1].pt[0].z =0;
  512.     gt[1].pt[1].x =0;    gt[1].pt[1].y =11;    gt[1].pt[1].z =0;
  513.     gt[1].pt[2].x =0;    gt[1].pt[2].y =11;    gt[1].pt[2].z =8;
  514.     gt[1].pt[3].x =0;    gt[1].pt[3].y =10;    gt[1].pt[3].z =8;
  515.     gt[1].type = 31;
  516.     gt[2].pt[0].x =0;    gt[2].pt[0].y =-11;    gt[2].pt[0].z =8;
  517.     gt[2].pt[1].x =0;    gt[2].pt[1].y =-11;    gt[2].pt[1].z =10;
  518.     gt[2].pt[2].x =0;    gt[2].pt[2].y =11;    gt[2].pt[2].z =10;
  519.     gt[2].pt[3].x =0;    gt[2].pt[3].y =11;    gt[2].pt[3].z =8;
  520.     gt[2].type = 31;
  521.     
  522.     //    Check Point
  523.     cp[0].pt[0].x =0;    cp[0].pt[0].y =-10;    cp[0].pt[0].z =0;
  524.     cp[0].pt[1].x =0;    cp[0].pt[1].y =-11;    cp[0].pt[1].z =0;
  525.     cp[0].pt[2].x =0;    cp[0].pt[2].y =-11;    cp[0].pt[2].z =10;
  526.     cp[0].pt[3].x =0;    cp[0].pt[3].y =-10;    cp[0].pt[3].z =10;
  527.     cp[0].type = 31;
  528.     cp[1].pt[0].x =0;    cp[1].pt[0].y =10;    cp[1].pt[0].z =0;
  529.     cp[1].pt[1].x =0;    cp[1].pt[1].y =11;    cp[1].pt[1].z =0;
  530.     cp[1].pt[2].x =0;    cp[1].pt[2].y =11;    cp[1].pt[2].z =10;
  531.     cp[1].pt[3].x =0;    cp[1].pt[3].y =10;    cp[1].pt[3].z =10;
  532.     cp[1].type = 31;
  533.  
  534.     //    Curve ( Panel )
  535.     cvp[0].pt[0].x =0;    cvp[0].pt[0].y =-10;    cvp[0].pt[0].z =49;
  536.     cvp[0].pt[1].x =0;    cvp[0].pt[1].y =0;        cvp[0].pt[1].z =42;
  537.     cvp[0].pt[2].x =0;    cvp[0].pt[2].y =10;     cvp[0].pt[2].z =42;
  538.     cvp[0].pt[3].x =0;    cvp[0].pt[3].y =0;        cvp[0].pt[3].z =49;
  539.     cvp[0].type = C32K(0,30,30);
  540.     cvp[1].pt[0].x =0;    cvp[1].pt[0].y =-10;    cvp[1].pt[0].z =35;
  541.     cvp[1].pt[1].x =0;    cvp[1].pt[1].y =0;        cvp[1].pt[1].z =42;
  542.     cvp[1].pt[2].x =0;    cvp[1].pt[2].y =10;     cvp[1].pt[2].z =42;
  543.     cvp[1].pt[3].x =0;    cvp[1].pt[3].y =0;        cvp[1].pt[3].z =35;
  544.     cvp[1].type = C32K(0,30,30);
  545.     cvp[3].pt[0].x =0;    cvp[3].pt[0].y =0;    cvp[3].pt[0].z =19;
  546.     cvp[3].pt[1].x =0;    cvp[3].pt[1].y =10;    cvp[3].pt[1].z =19;
  547.     cvp[3].pt[2].x =0;    cvp[3].pt[2].y =10;    cvp[3].pt[2].z =12;
  548.     cvp[3].pt[3].x =0;    cvp[3].pt[3].y =0;    cvp[3].pt[3].z =19;
  549.     cvp[3].type = 0;
  550.     cvp[4].pt[0].x =0;    cvp[4].pt[0].y =0;    cvp[4].pt[0].z =5;
  551.     cvp[4].pt[1].x =0;    cvp[4].pt[1].y =10;    cvp[4].pt[1].z =5;
  552.     cvp[4].pt[2].x =0;    cvp[4].pt[2].y =10;    cvp[4].pt[2].z =12;
  553.     cvp[4].pt[3].x =0;    cvp[4].pt[3].y =0;    cvp[4].pt[3].z =5;
  554.     cvp[4].type = 0;
  555.     cvp[2].pt[0].x =0;    cvp[2].pt[0].y =-10;    cvp[2].pt[0].z =19;
  556.     cvp[2].pt[1].x =0;    cvp[2].pt[1].y =0;        cvp[2].pt[1].z =12;
  557.     cvp[2].pt[2].x =0;    cvp[2].pt[2].y =-10;    cvp[2].pt[2].z =5;
  558.     cvp[2].pt[3].x =0;    cvp[2].pt[3].y =-10;    cvp[2].pt[3].z =5;
  559.     cvp[2].type = 0;
  560. }
  561.  
  562. void    setStandLf( short r, short h, short l, short sz )
  563. {
  564.     short    sx,sy;
  565.     sx = cx+r*sin(cang);
  566.     sy = cy-r*cos(cang);
  567.     putPoly( stand, 12, sx,sy,sz, cang, l/4, h/2, h/3, 1);
  568. }
  569.  
  570. void    setStandRt( short r, short h, short l, short sz )
  571. {
  572.     short    sx,sy;
  573.     sx = cx-r*sin(cang);
  574.     sy = cy+r*cos(cang);
  575.     putPoly( stand, 12, sx,sy,sz, cang, l/4, -h/2, h/3, 1);
  576. }
  577.  
  578. int     putChkPt()
  579. {
  580.     putPoly( cp, 2,cx,cy,cz,cang, 1, (_max(cwr,cwl)+9)/10, 5, C32K(0,1,1));
  581.     return crd;
  582. }
  583.  
  584. void    setCvp(short x,short y,short z,double ang)
  585. {
  586.     putPoly( cvp, 2,x,y,z,ang, 1, 1, 1, 1);
  587. }
  588.  
  589. main()
  590. {
  591.     setPolData();
  592.     int    i,mz;
  593.     double    sang,ang,mang;
  594.     pn = 0;
  595.     putPoly( mt, 4, 5200, 5700,0, 0.0,    60,60,80, C32K(1,0,1) );
  596.     putPoly( mt, 4,16000, 5500,0, 0.0,    300,300,200, C32K(0,0,1) );
  597.     putPoly( mt, 4, 9000, 7000,0, 0.0,    280,280,190, C32K(0,0,1) );
  598.     putPoly( mt, 4, 8500, 8000,0, 0.0,    300,300,200, C32K(0,0,1) );
  599.     putPoly( mt, 4, 8000, 7000,0, 0.0,    400,400,280, C32K(0,0,1) );
  600.  
  601.     crd = 0;
  602.     cx = 8000;
  603.     cy = 5000;
  604.     mz = cz = 0;
  605.     cwl = 100;
  606.     cwr = 100;
  607.     cbank = 0;
  608.     sang = cang = mang = 0;
  609.     chks = 0;
  610.     setR(STEP);
  611.  
  612.     setStandLf( 150, 100, 500, cz );
  613.     putPoly( gt, 3, cx,cy,cz,cang, 120/10, 120/10, 10, C32K(1,1,1) );
  614.  
  615.     goStr( 2000, mz );
  616.  
  617.     mang = 30*_PI/180;
  618.     curveRt( 200, mang, mz, 0 );
  619.     goStr( 500, mz );
  620.     mang = -30*_PI/180;
  621.     curveLf( 300, mang, mz, 0 );
  622.     goStr( 500, mz );
  623.     mang = 0*_PI/180;
  624.     curveRt( 200, mang, mz, 0 );
  625.  
  626.     goStr( 2000, mz );
  627.  
  628.     mang = 40*_PI/180;
  629.     curveRt( 400, mang, mz, 0 );
  630.     goStr( 3500, 0 );
  631.  
  632.     mang = 120*_PI/180;
  633.     curveRt( 400, mang, mz, 0 );
  634.     goStr( 200, 0 );
  635.     mang = 90*_PI/180;
  636.     curveLf( 200, mang, mz, 0 );
  637.     goStr( 1000, 0 );
  638.  
  639.     chk[chks] = putChkPt();
  640.     chks++;
  641.  
  642.     goStr( 1000, mz );
  643.     mz = 1000;
  644.     goStr( 1000, mz );
  645.     goStr( 2000, mz );
  646.  
  647.     mang = 180*_PI/180;
  648.     curveRt( 600, mang, mz, 0 );
  649.     goStr( 400, mz );
  650.     mang = 225*_PI/180;
  651.     curveRt( 200, mang, mz, 0 );
  652.     goStr( 200, mz );
  653.     mang = 180*_PI/180;
  654.     curveLf( 200, mang, mz, 0 );
  655.  
  656.     goStr( 3000, mz );
  657.  
  658.     mang = 270*_PI/180;
  659.     curveRt( 600, mang, mz, 0 );
  660.     mz = 1200;
  661.     goStr( 3400, mz );
  662.  
  663.     chk[chks] = putChkPt();
  664.     chks++;
  665.  
  666.     cwr=150;
  667.     mang = 180*_PI/180;
  668.     curveLf( 300, mang, mz, 40 );
  669.     mang = 90*_PI/180;
  670.     curveLf( 300, mang, mz, 0 );
  671.     cwr=100;
  672.     goStr( 200, mz );
  673.     mz = 1400;
  674.     goStr( 3200, mz );
  675.     mang = 180*_PI/180;
  676.     curveRt( 600, mang, mz, 0 );
  677.  
  678.     mz = 800;
  679.     goStr( 1000, mz );
  680.     mang = 225*_PI/180;
  681.     mz = 700;
  682.     curveRt( 400, mang, mz, 0 );
  683.     mz = 500;
  684.     goStr( 2000, mz );
  685.  
  686.     mang = 195*_PI/180;
  687.     curveLf( 200, mang, mz, 0 );
  688.     goStr( 200, mz );
  689.     mang = 255*_PI/180;
  690.     curveRt( 200, mang, mz, 0 );
  691.     goStr( 400, mz );
  692.     mang = 195*_PI/180;
  693.     curveLf( 200, mang, mz, 0 );
  694.     goStr( 400, mz );
  695.     mang = 255*_PI/180;
  696.     curveRt( 200, mang, mz, 0 );
  697.     goStr( 200, mz );
  698.     mang = 225*_PI/180;
  699.     curveLf( 200, mang, mz, 0 );
  700.     goStr( 2000, mz );
  701.  
  702.     chk[chks] = putChkPt();
  703.     chks++;
  704.  
  705.     mang = 270*_PI/180;
  706.     curveRt( 600, mang, mz, 0 );
  707.     goStr( 2200+374, mz );
  708.  
  709.     mang = 360*_PI/180;
  710.     mz = 0;
  711.     curveRt( 1200, mang, mz, 0 );
  712.     goStr( 3000-632, mz );
  713.  
  714.  
  715.     printf("pols : %dx3\n",crd);
  716.     printf("start: %d,%d end:%d,%d\n",road[0].x,road[0].y,
  717.                                     road[crd].x,road[crd].y);
  718.     for(i=0; chk[i]!=0; ++i)
  719.         printf("ChkPoint%d:%d\n",i,chk[i]);
  720.     exTime[0] = 20;
  721.     exTime[1] = 20;
  722.  
  723.     exTime[2] = 20;
  724.  
  725.     makeRdat();
  726.     polmax = pn;
  727.     save_texdat(8000-600,5000,0);
  728.  
  729.     initGrp();
  730.     putlmap();
  731.     getchar();
  732.  
  733.     return 0;
  734. }
  735.  
  736.  
  737.